import { logUnderline, logTitle, logSubTitle, log } from "../utils/index";
function use() {
    logTitle("一、基础类型");
    logSubTitle("1、布尔");
    logSubTitle("2、数字");
    logSubTitle("3、字符串");

    let bool: boolean = true;

    let num: number = 1;
    let num2: number = 0b1010;
    let num8: number = 0o7212;
    let num16: number = 0xa231;

    let str: string = "???";

    logSubTitle("4、数组");
    logSubTitle("5、元组");
    logSubTitle("6、枚举");

    let arr: number[] = [1, 2, 3];
    let arr1: Array<number> = [1, 2, 3];

    // Tuple
    let tuple: [string, number] = ["string", 1];
    // tuple[0].substr(1); // ok
    // tuple[1].substr(1); // error
    // 当访问越界属性，会使用 联合类型。以上述为例，即 tuple[5] 为 (string | number)类型

    enum Game {
        moba,
        rpg = 2,
        fps,
    }
    let gameType: Game = Game.fps;
    // 默认从0 开始赋值，也可以手动赋值，其后自动累加
    // log(Game);

    let a: any;
    // any 就是放弃类型检查。与Object不同，any依然可以调用a的方法

    logSubTitle("7、void");
    logSubTitle("8、null 和 undefined");
    logSubTitle("9、never");

    // void 表示空，没有返回，只能为它赋予undefined和null
    function foo(): void {}

    // 是所有类型的子类型。
    let ud: undefined = undefined;
    let nl: null = null;

    // never 表示抛错 或 永无返回值的 函数的返回类型；变量可以为never，当他们被永不为真的类型约束时
    // never只能赋值自己，是任何类型的子类型
    // 返回never的函数必须存在无法达到的终点
    function error(message: string): never {
        throw new Error(message);

        // 或者
        // while (true) {}
    }

    logSubTitle("10、object");

    logSubTitle("11、类型断言");
    let some: any = "I am a string";
    let someLen: number = (<string>some).length;
    // as的写法，在jsx中，只有as合法
    // let someLen: number = (some as string).length;

    logSubTitle("12、解构的类型添注写法");
    let o = {
        b: 12,
        c: "bar"
    };
    let { c, b }: { c: string; b: number } = o;

    logUnderline();
}

export default { use };
